package com.itheima.patterns.structuralpattern.proxy.dynamic_proxy.jdk_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//获取代理对象的工厂类
public class ProxyFactory {
    
    //声明目标对象
    //private TrainStation station = new TrainStation();

    private SellTickets sellTickets;

    public ProxyFactory(SellTickets sellTickets) {
        this.sellTickets = sellTickets;
    }

    //返回代理对象
    public SellTickets getProxyObject(){
        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

        /*
            newProxyInstance() 的三个参数及其含义如下:
            ClassLoader loader: 类加载器，用于加载代理类。可以通过目标对象获取类加载器
            Class<?>[] interfaces: 代理类实现的接口的字节码对象
            InvocationHandler h: 代理对象的调用处理程序
         */
        SellTickets proxyObject = (SellTickets) Proxy.newProxyInstance(
                sellTickets.getClass().getClassLoader(),
                sellTickets.getClass().getInterfaces(),
                new InvocationHandler(){
                    /*
                        Object proxy: 代理对象，和 proxyObject 对象是同一个对象，在 invoke 方法中基本不用
                        Method method: 对接口中的方法进行封装的 method 对象
                        Object[] args: 调用方法的实际参数
                        返回值：方法的返回值
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // 在方法执行前做一些操作
                        System.out.println("Before executing method: " + method.getName());
                        //执行目标对象的方法
                        method.invoke(sellTickets, args);
                        // 在方法执行后做一些操作
                        System.out.println("After executing method: " + method.getName());
                        return null;
                    }
                }
        );
        return proxyObject;
    }
}